package codegen;

import java.io.Serializable;

/**
 *
 * @author nilo VLL
 *
 */
public abstract class AbstractDescr implements Serializable {

    private static final long serialVersionUID = 1L;
    protected int size;

    protected AbstractDescr(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    abstract public void print();
    /**
     * Diese Variable steuert die Einrückung bei der Ausgabe
     */
    private static String spaces = "";

    /**
     * Diese Methode ist eine Darstellungshilfe für den abstrakten Syntaxbaum.
     * Die Einrückung wird aufgehoben.
     */
    public void unindent() {
        spaces = spaces.substring(2);
    }

    private void indent() {
        spaces = spaces + "  ";
    }

    /**
     * Einrückungstiefe um zwei Leerzeichen erhöhen und den String ausgeben.
     *
     * @param fieldName
     */
    public void trace(String s) {
        this.indent();
        if (CodeGen.debug) {
            System.out.println(spaces + s);
        }
    }

    @Override
    public String toString() {
        return "(" + size + ")";
    }
    
    /**
     * Wird für Typedesktriptoren benötigt, damit diese zu ihrem Basistypen aufgelöst werden können.
     * @return normalerweise this
     */
    public AbstractDescr resolve() {
        return this;
    }

    /**
     * Equals muss bei der Zuweisung benutzt werden, um die Typkompabilität zu prüfen
     * @param obj ...
     * @return 
     */
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof AbstractDescr) {
            AbstractDescr descr = (AbstractDescr) obj;
            return this.resolve().equals(descr.resolve());
        }
        return false;
    }
    
    /**
     * Templatemethode, die in equals benutzt wird. Muss zum Ändern des Verhaltens
     * von equals geändert werden
     * @param descr ...
     * @return 
     */
    protected boolean equals(AbstractDescr descr) {
        return this == descr;
    }
    
    
}